package com.g2.admin.utils;

import java.util.regex.Pattern;

/**
 * 正则表达式工具类
 */
public class RegularUtil {
    public static final String PATTERN_BRACKETS = "\\{[^}]*\\}";

    /**
     * 将SpringMVC的路径表达式转化为正则表达式。
     *
     * @param path
     * @return
     */
    public static Pattern getPathPattern(String path) {
        path = brackets2Star(path);
        char[] chars = path.toCharArray();
        int len = chars.length;
        StringBuilder sb = new StringBuilder();
        boolean preX = false;
        for (int i = 0; i < len; i++) {
            if (chars[i] == '*') {
                //如果是第二次遇到*，则将**替换成.*
                if (preX) {
                    sb.append(".*");
                    preX = false;
                } else if (i + 1 == len) {
                    //如果是遇到单星，且单星是最后一个字符，则直接将*转成[^/]*
                    sb.append("[^/]*");
                } else {
                    //否则单星后面还有字符，则不做任何动作，下一把再做动作
                    preX = true;
                    continue;
                }
            } else {
                //遇到非*字符
                if (preX) {
                    //如果上一把是*，则先把上一把的*对应的[^/]*添进来
                    sb.append("[^/]*");
                    preX = false;
                }
                if (chars[i] == '?') {
                    //接着判断当前字符是不是?，是的话替换成.
                    sb.append('.');
                } else {
                    //不是?的话，则就是普通字符，直接添进来
                    sb.append(chars[i]);
                }
            }
        }
        return Pattern.compile(sb.toString());
    }

    /**
     * 将字符串中的{}内容换成 *。
     * 如：/test/{id} 换成 /test/*
     *
     * @param original
     * @return
     */
    public static String brackets2Star(String original) {
        return Pattern.compile(PATTERN_BRACKETS).matcher(original).replaceAll("*");
    }

    /**
     * 判断是否匹配。
     * @param pattern   正则表达式
     * @param url       待匹配的URL
     * @return
     */
    public static boolean matcher(Pattern pattern, String url) {
        return pattern.matcher(url).matches();
    }
}
